﻿import matplotlib
from pylab import *

class Population:
    print "-----Bevoelkerungswachstum 2.0-----"
    print "------------------------"
    def __init__(self, initialpop, birthrate, deathrate, initialtime, finaltime, timestep): 
        self.initialpop = [initialpop]
        self.birthrate = birthrate
        self.deathrate = deathrate
        self.finaltime = finaltime
        self.initialtime = [initialtime]
        self.finaltime = finaltime
        self.timestep = timestep
        print "-----Es wird das Wachstum einer Bevoelkerung mit dem Anfangswert von",self.initialpop[0],"Personen"
        print "-----im Zeitraum von",self.initialtime[0],"bis",self.finaltime
        print "-----bei konstanter Geburtenrate (",self.birthrate,") und Sterberate (",deathrate,")"
        print "-----in Zeitschritten von ",self.timestep, "berechnet."
        print "-------------------------"
    '''
    Die Methode initialisiert alle Attribute und macht diese für alle
    Methoden der Klasse verfügbar.
    '''
    def birth(self,initialpop):
        return initialpop * self.birthrate*self.timestep
    '''
    Methode zur Berechnung der Geburten innerhalb eines Zeitschrittes.
    '''
    def death (self,initialpop):
        return initialpop * self.deathrate*self.timestep
    '''
    Methode zur Berechnung der Todesfälle innerhalb eines Zeitschrittes.
    '''
    def setPop(self):
        self.timerange = self.finaltime-self.initialtime[0]
        print "-----Gesamtanzahl der Zeitschritte:", self.timerange/self.timestep
        for time in range (int(self.timerange/self.timestep)):
            self.initialtime.append(self.initialtime[time] + self.timestep)
            self.initialpop.append(self.initialpop[time] + self.birth(self.initialpop[time]) - self.death(self.initialpop[time]))
            # print "Nach", self.initialtime[time], "Jahren:", self.initialpop[time], "EinwohnerInnen"
        return self.initialpop
    '''
    Methode zur Berechnung der Bevölkerung. Es wird die Anzahl der Zeitschritte
    ausgegeben, damit überprüft werden kann, ob es sich dabei um eine ganze Zahl
    handelt.
    Kommentarzeichen # entfernen, wenn die Entwicklung am Bildschirm
    nachvollzogen werden soll.
    Die Werte der Bevölkerung und der dazugehörigen Zeit (für jeden Zeitschritt) werden in jeweils eine
    Liste geschrieben.
    '''
    def getPop (self): 
        self.setPop()
        print "------------------------"
        print "-----Bevoelkerung nach", self.initialtime[int(self.finaltime/self.timestep)],"Jahren:", self.initialpop[int(self.finaltime/self.timestep)], "EinwohnerInnen"
    '''
    Methode, die die Bevölkerungszahl zum festgelegten Ende ausgibt.
    '''
    def plotPop(self):
        x_series = [self.initialtime]
        y_series = [self.initialpop]
        axis([self.initialtime[0], self.finaltime, self.initialpop[0], self.initialpop[int(self.finaltime/self.timestep)]])
        plot(x_series,y_series,"ro")
        xlabel("Zeit")
        ylabel("Bevoelkerung")
        title("Bevoelkerungsentwicklung")
        show()
    '''
    Methode, die die Bevölkerungsentwicklung graphisch darstellt (mit Hilfe von
    matplotlib und pyplot). Dazu werden alle in die Listen geschriebenen Werte
    geplottet ("ro": mit roten Punkten, keine Linie). Achsen sind von den
    Anfangs- und Endwerten der Zeit und Bevölkerung abhängig.
    '''
meine_Population = Population(20,0.2,0.1,0,100,0.1)
meine_Population.getPop()
meine_Population.plotPop()
'''
Initialisiert das Objekt meine_Population der Klasse Population mit wählbaren
Attributen und ruft die Methoden getPop und plotPop der Klasse auf.
'''
